package img

import (
	"fmt"
	"image"
	// "io/ioutil"
	"errors"
	"image/png"
	"net/http"
	"os"
	"strconv"
	"time"
)

type ImgData struct {
	Img    image.Image
	format string
}

/*
Get Img
*/
func GetImg(url string) (image.Image, string) {

	c := &http.Client{
		Timeout: 1 * time.Second,
	}
	resp, err := c.Get(url)
	defer resp.Body.Close()
	img, format, err := image.Decode(resp.Body)
	fmt.Println(format, err)
	// data, err := ioutil.ReadAll(resp.Body)
	// ioutil.WriteFile("./test.png", data, 0666)
	// error := ioutil.WriteFile("./test.png", m, 0644)
	return img, format
	// b := img.Bounds()
	// imgWidth := b.Max.X
	// imgHeight := b.Max.Y
	// fmt.Println("w-h:", imgHeight, imgWidth)
	// var pbImage []byte
	// if format == "jpeg" {
	//  fmt.Println("jpeg")
	//  buf := new(bytes.Buffer)
	//  err := jpeg.Encode(buf, img)
	//  pbImage = buf.Bytes()
	//  fmt.Println(len(pbImage), err, imgWidth*imgHeight)
	// } else if format == "png" {
	//  fmt.Println("png")
	//  buf := new(bytes.Buffer)
	//  err := png.Encode(buf, img)
	//  pbImage = buf.Bytes()
	//  fmt.Println(len(pbImage), err, imgWidth*imgHeight)
	// } else {
	//  panic("unsupport image type!")
	// }
	// return pbImage, imgWidth, imgHeight
}

/*
Cut Img by pos
*/
func CutImg(img image.Image, pos [][]int, path string) (result []image.Image) {
	// buf := bytes.NewBuffer(data)
	// img_end, format_end, err := image.Decode(buf_end)

	// 切图
	// result = make([]*image.RGBA, 0)
	for k, v := range pos {
		// img_end.
		if len(v) != 4 {
			panic("bad case for postion!")
		}
		img_tmp, err := imageCopy(img, v[0], v[1], v[2]-v[0], v[3]-v[1])
		if err == nil {
			result = append(result, img_tmp)
			f, _ := os.Create(path + strconv.Itoa(k) + ".png") //创建文件
			defer f.Close()                                    //关闭文件
			png.Encode(f, img_tmp)                             //写入文件
		} else {
			fmt.Println("CutImag:", err)
		}

	}
	return
}

/*
get small img by so
*/
// func GetImgLine(pbImage []byte, width int, height int) (result [][][]int) {
func GetImgLine(img image.Image) (result [][]int) {
	// b := img.Bounds()
	// imgWidth := b.Max.X
	// imgHeight := b.Max.Y
	// fmt.Println("w-h:", imgHeight, imgWidth)
	// var pbImage []byte
	// if format == "jpeg" {
	// 	fmt.Println("jpeg")
	// 	buf := new(bytes.Buffer)
	// 	err := jpeg.Encode(buf, img)
	// 	pbImage = buf.Bytes()
	// 	fmt.Println(len(pbImage), err, imgWidth*imgHeight)
	// } else if format == "png" {
	// 	fmt.Println("png")
	// 	buf := new(bytes.Buffer)
	// 	err := png.Encode(buf, img)
	// 	pbImage = buf.Bytes()
	// 	fmt.Println(len(pbImage), err, imgWidth*imgHeight)
	// } else {
	// 	panic("unsupport image type!")
	// }
	result = getImgLineBySO(img)
	// tmp restult

	// for i := 0; i < 5; i++ {
	// 	var tmpArr []int
	// 	for j := 0; j < 4; j++ {
	// 		// var tmpArr_tmp []int
	// 		// for k := 0; k < 3; k++ {
	// 		//  tmpArr_tmp = append(tmpArr_tmp, k)
	// 		// }
	// 		tmpArr_tmp := j * 10
	// 		tmpArr = append(tmpArr, tmpArr_tmp)
	// 	}
	// 	restult = append(restult, tmpArr)
	// }
	// result = [...][...][...]int{{{1, 2}, {3, 4}}, {{3, 4}, {6, 7}}, {{11, 12}, {13, 14}}}
	return
}

func imageCopy(src image.Image, x, y, w, h int) (image.Image, error) {
	var subImg image.Image
	if rgbImg, ok := src.(*image.YCbCr); ok {
		fmt.Println("image.YCbCr")
		subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.YCbCr) //图片裁剪x0 y0 x1 y1
	} else if rgbImg, ok := src.(*image.RGBA); ok {
		fmt.Println("image.RGBA")
		subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.RGBA) //图片裁剪x0 y0 x1 y1
	} else if rgbImg, ok := src.(*image.NRGBA); ok {
		fmt.Println("image.NRGBA")
		subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.NRGBA) //图片裁剪x0 y0 x1 y1
	} else {
		return subImg, errors.New("图片解码失败")
	}
	return subImg, nil
}
